
// 栈
class Stack {
  constructor() {
    // 初始化栈 用数组模拟栈
    this.stack = [];
  }
  // 入栈
  push(item){
    this.stack.push(item);
  }
  // 出栈
  pop(){
    return this.stack.pop();
  }
  // 查看栈顶元素
  peek(){
    return this.stack[this.stack.length - 1];
  }
  // 判断栈是不是空
  isEmpty(){
    return this.stack.length === 0;
  }
  // 清空栈
  clear(){
    this.stack = []
  }
  // 栈的大小
  size(){
    return this.stack.length;
  }
  // 打印栈
  print(){
    console.log(this.stack.toString());
  }
}

// 栈处理括号的问题  力扣的经典题目
// {}[]()   随机的排列组合 [{}](])   {[[()]}]}  [{]}

// 判断一个文本中的括号是否闭合,
// 如: const text = "({[({{abc}})][{1}]})2([]){({[]})}[]", 判断所有括号是否闭合

function isValid(text){
  // 创建栈
  const stack = new Stack();
  // 匹配的对象
  const map = {
    '{': '}',
    '[': ']',
    '(': ')',
  }
  // 循环文本
  for(let i = 0; i < text.length; i++){
    //{}[]() 
    const item = text[i];
    // 如果是左括号 则入栈
    if(map[text[i]]){
      stack.push(map[text[i]]);
    }else{
      // 如果是右括号 则判断栈顶元素是否匹配
      if(stack.pop() !== item){
        // 如果匹配 则出栈
        return false
      }
    }
  }
  // 如果栈为空 则返回true
  return stack.isEmpty();
}

isValid('{(){}}');// ?